package thread;

import java.util.concurrent.*;

/**
 * 创建和运行线程：
 *  运行线程的方式，只有一种：【thread.start();】
 */
public class CreateThread {

    public static void main(String[] args) {
        CreateThread createThread = new CreateThread();
        createThread.createThread1();
        createThread.createThread2();
        createThread.createThread3();
        createThread.createThread4();
        System.out.println("主线程，名称为："+Thread.currentThread().getName());
    }

    /////////////////////////////////////////
    //  创建线程的方式
    //////////////////////////////////////////

    /**
     * 第一种：重写Thread的run方法。
     */
    private void createThread1(){
        Thread thread = new MyThread();
        thread.start();
    }

    /**
     * 第二种：实现runnable接口
     */
    private void createThread2(){
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("这是一个runnable的线程，线程名称为："+Thread.currentThread().getName());
            }
        });
        thread.start();
    }

    /**
     * 第三种：实现callable接口。
     */
    private void createThread3(){
        FutureTask futureTask = new FutureTask<String>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("这是一个callable的线程，线程名称为："+Thread.currentThread().getName());
                return "callable";
            }
        });
        Thread thread=new Thread(futureTask);
        thread.start();

    }

    /**
     * 第四种：通过线程池创建线程。
     */
    private void createThread4(){
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.execute(()->{
            System.out.println("这是一个线程池的方法，线程名称为："+Thread.currentThread().getName());
        });
        executorService.shutdown();
    }

}

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("启动一个新线程，线程名称为："+Thread.currentThread().getName());
    }
}
